//
// Created by tang on 2022/1/11.
//

#ifndef DIARYTOOL_UI_COMPONENT_HPP
#define DIARYTOOL_UI_COMPONENT_HPP

#include <memory>
#include <list>
#include "event/events.hpp"
#include <imgui/imgui.h>

using ComponentPtr = std::shared_ptr<class UiComponent>;

enum ComponentFlag : unsigned int {
    eMenu = 0x0001,     // 具有菜单
    eTab = 0x0002,      // 具有选项卡
    eDialog = 0x0004,   // 具有对话框
};

#define TAB_NAME_OF(TabId) AppEvent::SelectTabEvent::tabName(TabId)

class UiComponent {
public:
    virtual ~UiComponent() = default;

    /**
     * 获取组件提供哪些东西
     * @return
     */
    [[nodiscard]] virtual unsigned Flags() const = 0;

    /**
     * 渲染组件内容
     * @param flag 哪些内容 @see ComponentFlag
     */
    virtual void RenderContent(ComponentFlag flag) = 0;

    /**
     * 获取名称（要求不为空），Menu 不需要提供名称
     * @param flag 哪个名称 @see ComponentFlag
     * @return 名称
     */
    virtual const char* GetName(ComponentFlag flag);

    /**
     * @brief 获取对话框大小
     * 
     * @param viewportSize 当前的窗口大小，用于参考
     * @return ImVec2 实际的对话框大小
     */
    [[nodiscard]] virtual ImVec2 DialogSize(ImVec2 viewportSize);

    /**
     * @brief 初始化，这里会在主循环之前调用
     * 
     */
    virtual void OnInit();

    /**
     * @brief 清理工作，会在主循环之后调用
     * 
     */
    virtual void OnCleanup();

    /**
     * @brief 询问相关部件是否需要显示
     * 
     * @param c 要查询的部件，其中 eDialog 永远不会询问
     * @return true 需要显示（默认实现返回此值）
     * @return false 不需要显示
     */
    virtual bool Show(ComponentFlag c) const;
};

void HelperMaker(const char* desc, bool sameLine);

#define MODAL_FLAG "!"
#define MODAL_DIALOG_NAME(NAME) MODAL_FLAG NAME

#include "gui/dialog_names.h"

#endif //DIARYTOOL_UI_COMPONENT_HPP
